home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / hardware / cachecrd.1 next >
Text File  |  1989-07-13  |  32KB  |  809 lines

  1. Path: xanth!ames!apple!sun-barr!newstop!sun!swap!page
  2. From: page%swap@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i169:  cachecard - control expansion card caching
  5. Message-ID: <115427@sun.Eng.Sun.COM>
  6. Date: 13 Jul 89 17:54:07 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 798
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: daveh@cbmvax.cbm.commodore.com (Dave Haynie)
  12. Posting-number: Volume 89, Issue 169
  13. Archive-name: hardware/cachecard.1
  14.  
  15. This program is an accessory to SetCPU for use with A2620s or 68030 systems.
  16. It modifies the MMU table set up by SetCPU to selectively control caching
  17. for each expansion card.  It's also an example of how an accessory program
  18. in general can track down and modify the SetCPU MMU table without having to
  19. read all kinds of MMU registers and figure it out for yourself.
  20.  
  21. [uuencoded executable included.  ..bob]
  22.  
  23. # This is a shell archive.
  24. # Remove anything above and including the cut line.
  25. # Then run the rest of the file through 'sh'.
  26. # Unpacked files will be owned by you and have default permissions.
  27. #----cut here-----cut here-----cut here-----cut here----#
  28. #!/bin/sh
  29. # shar: SHell ARchive
  30. # Run the following text through 'sh' to create:
  31. #    README
  32. #    cachecard.c
  33. #    cachecard.h
  34. #    030Stuff.a
  35. #    makefile
  36. #    CacheCard.uu
  37. # This is archive 1 of a 1-part kit.
  38. # This archive created: Thu Jul 13 10:41:48 1989
  39. echo "extracting README"
  40. sed 's/^X//' << \SHAR_EOF > README
  41. X
  42. X
  43. X
  44. X            CacheCard V1.00
  45. X
  46. X        Copyright 1989 by Dave Haynie
  47. X
  48. XCacheCard may be distributed in any physical or electronic form on a not for
  49. Xprofit basis (including pay BBS systems that charge for connect time but not
  50. Xfor the actual software downloads, and disk collections such as the Fred
  51. XFish Freely Redistributable Amiga Disk Library).  Any commercial concerns
  52. Xmay negotiate the distribution of CacheCard and SetCPU with the author.
  53. X
  54. X
  55. XWHAT IT IS?
  56. X
  57. X    CacheCard is an accessory program to be used with the MMU setup
  58. Xcreated by SetCPU V1.5.  It's used to control caching by the 68020 or
  59. X68030 of a particular expansion card.  In most cases, there's no trouble
  60. Xwith instruction caching, but the 68030's data cache can get you into
  61. Xtrouble with shared memory devices like Bridge Cards or possibly some
  62. XI/O devices.  While most 68030 implementations have some hardware level
  63. Xcontrol to avoid caching of chip RAM, motherboard I/O, and even the
  64. Xexpansion bus I/O space, it's impossible for such hardware to cover every
  65. Xpossibility.  Using CacheCard, the cache can be selectively disabled for
  66. Xany card in software.
  67. X
  68. XHOW DO I USE IT
  69. X
  70. X    There are two forms of the command.  Simply typing "CacheCard" at
  71. Xa shell prompt will display each of the expansion cards in the system by
  72. X(manufacturer,product) code.  My system looks like this:
  73. X
  74. X    3> CacheCard
  75. X    CacheCard V1.00 Copyright 1989 by Dave Haynie
  76. X    DEVICE             ADDRESS     LENGTH    CACHE
  77. X    ( 202,  51)        200000      400000    ENABLED
  78. X    ( 202,   3)        e90000       10000    ENABLED
  79. X    ( 202,  45)        ea0000       10000    ENABLED
  80. X    ( 202,   a)        600000      200000    ENABLED
  81. X    ( 201,   1)        800000       80000    DISABLED
  82. X
  83. XHere I have previously run CacheCard to disable the cache for the device
  84. X(201,1), which is the Commodore A2286 Bridge Card.  In order to change
  85. Xthe cachability, you'd invoke CacheCard as:
  86. X
  87. X    3> CacheCard ENABLE 201 1
  88. X
  89. Xwhich would turn the cache back on for the Bridge Card, or:
  90. X
  91. X    3> CacheCard DISABLE 201 1
  92. X
  93. Xwhich will shut it back down again.  Note that the actual caches may not
  94. Xreally be on; that's a function of SetCPU.  If a cache is listed as being
  95. XDISABLED for a card, you can be certain that it's disabled, regardless of
  96. Xthe cache setting.  Note also that even if a card is listed as enabled, it
  97. Xcould still be disabled by hardware, as in the case of the e90000 and 
  98. Xea0000 cards above in conjunction with the Amiga A2630.  All numbers are
  99. Xin hexidecimal.
  100. X
  101. X
  102. X
  103. X            -Dave Haynie
  104. X             7/7/89
  105. X
  106. X             Bix: Hazy    PLINK: D-Dave H
  107. X
  108. X             New Land Address:
  109. X
  110. X             284 Memorial Avenue
  111. X             Gibbstown, NJ 08027                 
  112. X                
  113. SHAR_EOF
  114. echo "extracting cachecard.c"
  115. sed 's/^X//' << \SHAR_EOF > cachecard.c
  116. X/*
  117. X    CacheCard V1.0
  118. X    Copyright 1989 by Dave Haynie
  119. X
  120. X    MAIN PROGRAM
  121. X
  122. X    This program is a simple cache manager for use with SetCPU V1.5.
  123. X    It allows the cachability of various autoconfig cards to be
  124. X    adjusted.
  125. X    
  126. X    The current MMU table used by SetCPU establishes 128K pages using
  127. X    the short form of the early termination descriptor.  Except for
  128. X    any CardROMs that are translated, the table is only 1 level.  In
  129. X    systems with more than 16meg of address space, the MMU table will
  130. X    be accordingly adjusted, though it's unlikely that any program
  131. X    will need adjust table parameters beyond the first 16 megabytes.
  132. X*/
  133. X
  134. X#include "cachecard.h"
  135. X
  136. X#define max(a,b)    ((a>b)?a:b)
  137. X#define PAGESIZE    0x00020000L
  138. X
  139. Xstruct ExpansionBase *ExpansionBase = NULL;    /* The expansion library */
  140. Xstruct systag *tag;                /* The SetCPU system tag */
  141. X
  142. X/* ====================================================================== */
  143. X
  144. X/* A simple string comparison. */
  145. X
  146. XBOOL striequ(s1,s2)
  147. Xchar *s1,*s2;
  148. X{
  149. X   BOOL aok = FALSE;
  150. X   
  151. X   while (*s1 && *s2 && (aok = (*s1++ & 0xdf) == (*s2++ & 0xdf)));
  152. X   return (BOOL) (!*s1 && !*s2 && aok);
  153. X}
  154. X
  155. X/* This routine gets the system tag from the patched system, if it's
  156. X   there.  This tag is stored in an invalid table entry that's within the
  157. X   physical ROM image.  If the MMU isn't on, I assume there's no system
  158. X   tag. */
  159. X   
  160. Xstruct systag *GetSysTag() {
  161. X   ULONG i, myCRP[2], *table = NULL;
  162. X
  163. X   if (!(GetTC() & TC_ENB)) return NULL;
  164. X
  165. X   GetCRP(myCRP);
  166. X   table = (ULONG *)myCRP[1];
  167. X   for (i = 0; i < 4096; ++i)
  168. X      if ((table[i] & PD_DT_TYPE) == PD_DT_INVALID && IV_ADDR(table[i]))
  169. X         return (struct systag *)IV_ADDR(table[i]);
  170. X
  171. X   return NULL;
  172. X}
  173. X
  174. X/* This function prints a list of active devices and their associated
  175. X   cache status. */
  176. X   
  177. Xvoid PrintDevs() {
  178. X   struct ConfigDev *cd = NULL;
  179. X   ULONG page;
  180. X
  181. X   if (!(cd = FindConfigDev(NULL,-1L,-1L))) {
  182. X      printf("No Amiga Devices present\n");
  183. X      return;
  184. X   }
  185. X
  186. X   printf("DEVICE             ADDRESS     LENGTH    CACHE\n");
  187. X
  188. X   do {
  189. X      printf("(%4x,%4x)      ",cd->cd_Rom.er_Manufacturer,cd->cd_Rom.er_Product);
  190. X      printf("%8lx    %8lx    ",cd->cd_BoardAddr,cd->cd_BoardSize);
  191. X      
  192. X      page = (ULONG)cd->cd_BoardAddr/PAGESIZE;
  193. X      if (tag->maintable[page] & PD_CI)
  194. X         printf("DISABLED\n");
  195. X      else
  196. X         printf("ENABLED\n");
  197. X   
  198. X   } while (cd = FindConfigDev(cd,-1L,-1L));
  199. X}
  200. X
  201. X
  202. X/* The main thing */
  203. X
  204. Xint main(argc,argv)
  205. Xint argc;
  206. Xchar *argv[];
  207. X{
  208. X   ULONG mmu = 0, page, size, manuf, prod;
  209. X   BOOL ever;
  210. X   struct ConfigDev *cd;
  211. X   
  212. X   printf("\23333mCacheCard V%1.2f Copyright 1989 by Dave Haynie\2330m\n",
  213. X             ((float)PROGRAM_VERSION)/100.0);
  214. X
  215. X   if (argc == 2 && argv[1][0] == '?') {
  216. X      printf("Usage: CacheCard [ENABLE|DISABLE manuf# prod#]\n");
  217. X      exit(0);
  218. X   }
  219. X   if ((mmu = GetMMUType()) != 68851 && mmu != 68030) {
  220. X      printf("Error: System does not contain an MMU\n");
  221. X      exit(10);
  222. X   }
  223. X   if (!(tag = GetSysTag())) {
  224. X      printf("Error: SetCPU FASTROM or KICKROM must be installed\n");
  225. X      exit(10);
  226. X   }
  227. X   if (tag->tagsize >= SizeOf(struct systag) && tag->tablerev != TABLE_REV) {
  228. X      printf("Error: Version of SetCPU is incompatible, use newer CacheCard program\n");
  229. X      exit(0);
  230. X   }
  231. X   if (!(ExpansionBase = (struct ExpansionBase *)OpenLibrary("expansion.library",33L))) {
  232. X      printf("Error: Can't find \"expansion.library\"\n");
  233. X      exit(10);
  234. X   }
  235. X
  236. X   if (argc > 1) {
  237. X      sscanf(argv[2],"%lx",&manuf);
  238. X      sscanf(argv[3],"%lx",&prod);
  239. X   
  240. X      if (striequ(argv[1],"DISABLE"))
  241. X         ever = FALSE;
  242. X      else if (striequ(argv[1],"ENABLE"))
  243. X         ever = TRUE;
  244. X      else {
  245. X         printf("Error: Illegal option\n");
  246. X         exit(10);
  247. X      }
  248. X
  249. X      if (!(cd = FindConfigDev(NULL,manuf,prod))) {
  250. X         printf("Error: Device (%lx,%lx) Not Found\n",manuf,prod);
  251. X         CloseLibrary(ExpansionBase);
  252. X         exit(10);
  253. X      }
  254. X      
  255. X      page = (ULONG)cd->cd_BoardAddr/PAGESIZE;
  256. X      size = max((ULONG)cd->cd_BoardSize/PAGESIZE,1);
  257. X
  258. X      while (size-- && page < tag->tablesize)
  259. X         if ((tag->maintable[page] & PD_DT_TYPE) != PD_DT_INVALID) {
  260. X            if (ever)
  261. X               tag->maintable[page++] &= ~PD_CI;
  262. X            else 
  263. X               tag->maintable[page++] |=  PD_CI;
  264. X         }
  265. X   }
  266. X   
  267. X   PrintDevs();
  268. X
  269. X   CloseLibrary(ExpansionBase);
  270. X   exit(0);
  271. X}
  272. SHAR_EOF
  273. echo "extracting cachecard.h"
  274. sed 's/^X//' << \SHAR_EOF > cachecard.h
  275. X/*
  276. X    CacheCard V1.0
  277. X    Copyright 1989 by Dave Haynie
  278. X
  279. X    MAIN HEADER FILE
  280. X*/
  281. X
  282. X
  283. X#define PROGRAM_VERSION    100
  284. X
  285. X#include <exec/types.h>
  286. X#include <exec/execbase.h>
  287. X#include <exec/nodes.h>
  288. X#include <exec/lists.h>
  289. X#include <exec/memory.h>
  290. X#include <libraries/expansionbase.h>
  291. X#include <libraries/configregs.h>
  292. X#include <libraries/configvars.h>
  293. X#include <libraries/dosextens.h>
  294. X#include <functions.h>
  295. X#include <stdio.h>
  296. X#include <ctype.h>
  297. X
  298. X/* ====================================================================== */
  299. X
  300. X/* Define important bits used in various MMU registers. */
  301. X
  302. X/* Here are the TC definitions.  The TC register is 32 bits long. */
  303. X
  304. X#define    TC_ENB        (1L<<31)        /* Enable the MMU */
  305. X#define    TC_SRE        (1L<<25)        /* For separate Supervisor */
  306. X#define    TC_FCL        (1L<<24)        /* Use function codes? */
  307. X#define    TC_PS(x)    ((ULONG)((x)&0x0f)<<20)    /* Page size */
  308. X#define TC_IS(x)    ((ULONG)((x)&0x0f)<<16)    /* Logical shift */
  309. X#define    TC_TIA(x)    ((ULONG)((x)&0x0f)<<12)    /* Table indices */
  310. X#define    TC_TIB(x)    ((ULONG)((x)&0x0f)<<8)
  311. X#define TC_TIC(x)    ((ULONG)((x)&0x0f)<<4)
  312. X#define    TC_TID(x)    ((ULONG)((x)&0x0f)<<0)
  313. X
  314. X/* Here are the page descriptor definitions, for short desctriptors only,
  315. X   since that's all I'm using at this point. */
  316. X   
  317. X#define    PD_ADDR(x)    ((ULONG)(x)&~0x0fL)    /* Translated Address */
  318. X#define IV_ADDR(x)    ((ULONG)(x)&~0x03L)    /* Invalid unused field */
  319. X#define PD_CI        (1L<<6)            /* Cache inhibit */
  320. X#define    PD_WP        (1L<<2)            /* Write protect it! */
  321. X#define PD_DT_TYPE    0x03            /* Page descriptor type */
  322. X#define PD_DT_INVALID    0x00            /* Invalid root descriptor */
  323. X#define    PD_DT_PAGE    0x01            /* Fixed offset, auto-genned */
  324. X#define PD_DT_V4BYTE    0x02            /* Short root descriptor */
  325. X#define    PD_DT_V8BYTE    0x03            /* Long root descriptor */
  326. X
  327. X/* This is needed for identification of bogus systems that test positive
  328. X   for MMUs. */
  329. X
  330. X#define SizeOf(x)    ((ULONG)sizeof(x))
  331. X
  332. X/* ====================================================================== */
  333. X
  334. X/* From the 030STUFF.A module */
  335. X
  336. Xextern void             GetCRP();
  337. Xextern ULONG             GetTC(),
  338. X                GetMMUType();
  339. X
  340. X/* ====================================================================== */
  341. X
  342. X/* This section describes the system tag structure, where I stick all the
  343. X   information that I like to keep around.  */
  344. X   
  345. X#define ROM_NOP            0x0000    /* No ROM operation called for */
  346. X#define ROM_FAST        0x0002    /* Normally installed FASTROM image */
  347. X#define ROM_KICK        0x0003    /* Installed as a KICK image */
  348. X#define ROM_FKICK        0x0004    /* A KICK image made into a FAST image */
  349. X
  350. X#define TABLE_REV        1    /* MMU table compatibility revision */
  351. X/* This is the special descriptor stored by SetCPU to help it find itself
  352. X   and figure out just what it's done.  The GetSysTag() routine knows how
  353. X   to find this structure on a properly SetCPU-ed system.  Anyone making
  354. X   modifications to this program and expecting to work with SetCPU now
  355. X   and in the future must check the "tagsize", "progver" and "tablerev" 
  356. X   fields to ensure they don't make mistakes.  The "tagsize" field tell you
  357. X   how large the tag is; it'll probably grow in future versions.  The
  358. X   "progver" identifies the version of SetCPU that built the tables; the
  359. X   "progver" field will be 150 for SetCPU 1.50.  The "tablerev" field is
  360. X   indicates the revision level of the MMU table.  So far, the table is
  361. X   revision 1; all version of SetCPU use this type of table (check the
  362. X   tagsize first; currenly released version of SetCPU, like V1.50, have a
  363. X   smaller systag).  */
  364. X
  365. Xstruct systag {
  366. X   ULONG         tagsize;    /* Size of this tag */
  367. X   ULONG         progver;    /* The program version */
  368. X   ULONG        *maintable;    /* The main ROM table */
  369. X   ULONG        *romimage;    /* The main ROM image */
  370. X   UWORD         romtype;    /* Type of MMU ROM */
  371. X   UWORD         patches;    /* The number of other patches applied */
  372. X   struct MemChunk     *patchlist;    /* List of installed patches */
  373. X   struct ExpROMData    *devs;        /* Translated device ROMs */
  374. X   ULONG        TC;        /* Precomputed TC used for KICK. */
  375. X   ULONG        CRP[2];        /* Precomputed CRP used for KICK. */
  376. X   UWORD        config;        /* Configuration status. */
  377. X   ULONG        BerrSize;    /* Size of bus error handler. */
  378. X   char            *OldBerr;    /* The old BERR routine. */
  379. X   char            *BerrHandler;    /* My BERR routine. */
  380. X   short        wrapup;        /* Upper address wrap bound. */
  381. X   short        wrapdown;    /* Lower address wrap bound. */
  382. X   ULONG        tablesize;    /* Main table size. */
  383. X   char            *ResetCode;    /* Actual reset routine */
  384. X   ULONG        tablerev;    /* Revision of table structure */
  385. X};
  386. X
  387. Xextern struct systag *GetSysTag();
  388. X
  389. SHAR_EOF
  390. echo "extracting 030Stuff.a"
  391. sed 's/^X//' << \SHAR_EOF > 030Stuff.a
  392. X;======================================================================
  393. X;
  394. X;    CacheCard V1.0
  395. X;    Copyright 1989 by Dave Haynie
  396. X;
  397. X;    68030 Assembly Function Module
  398. X;
  399. X;    This module contains MMU access functions.
  400. X;
  401. X;======================================================================
  402. X
  403. X;======================================================================
  404. X;
  405. X;    Macros & constants used herein...
  406. X;
  407. X;======================================================================
  408. X
  409. XCALLSYS macro   *
  410. X    jsr     LVO\1(A6)
  411. X    endm
  412. X
  413. XAFB_68030    EQU    2
  414. X
  415. XATNFLGS        EQU    $129
  416. X
  417. XLVOSupervisor    EQU    -30
  418. XLVOFindTask    EQU    -294
  419. X
  420. X;======================================================================
  421. X;
  422. X;    Need just a little more stuff
  423. X;
  424. X;======================================================================
  425. X
  426. X    NOLIST
  427. X    include "exec/execbase.i"
  428. X    include "exec/tasks.i"
  429. X    LIST
  430. X
  431. X    machine mc68020
  432. X        mc68881
  433. X    cseg
  434. X
  435. X;**********************************************************************
  436. X;
  437. X;    This section contains functions that identify and operate on
  438. X;    MMU things.  Unfortunately, there aren't any MMU op-codes in
  439. X;    the Manx assembler yet, so I have to fudge them here.
  440. X;
  441. X;**********************************************************************
  442. X
  443. X    public _GetMMUType    ; Returns the type of MMU
  444. X    public _GetCRP        ; Gets MMU CRP register
  445. X    public _GetTC        ; Gets MMU TC register
  446. X
  447. X;======================================================================
  448. X;
  449. X;    This function returns 0L if the system contains no MMU, 
  450. X;    68851L if the system does contain an 68851, or 68030L if the
  451. X;    system contains a 68030.
  452. X;
  453. X;    This routine seems to lock up on at least some CSA 68020 
  454. X;    boards, though it runs just fine on those from Ronin and 
  455. X;    Commodore, as well as all 68030 boards it's been tested on.
  456. X;
  457. X;    ULONG GetMMUType()
  458. X;
  459. X;======================================================================
  460. X
  461. X_GetMMUType:
  462. X    move.l    4,a6            ; Get ExecBase
  463. X    movem.l    a3/a4/a5,-(sp)        ; Save this stuff
  464. X    move.l    #0,a1    
  465. X    CALLSYS    FindTask        ; Call FindTask(0L)
  466. X    move.l    d0,a3
  467. X
  468. X    move.l    TC_TRAPCODE(a3),a4    ; Change the exception vector
  469. X    move.l    #2$,TC_TRAPCODE(a3)
  470. X    
  471. X    move.l    #-1,d0            ; Try to detect undecode FPU
  472. X    subq.l    #4,sp            ; Let's try an MMU instruction
  473. X    dc.w    $f017            ; Slimey PMOVE tc,(sp)
  474. X    dc.w    $4200
  475. X    cmpi    #0,d0            ; Any MMU here?
  476. X    beq    1$
  477. X    cmpi    #-1,d0            ; Hardware bugs?
  478. X    beq    1$
  479. X    btst.b    #AFB_68030,ATNFLGS(a6)    ; Does the OS think an '030 is here?
  480. X    beq    1$
  481. X    move.l    #68030,d0
  482. X
  483. X1$
  484. X    addq.l    #4,sp            ; Return that local
  485. X    move.l    a4,TC_TRAPCODE(a3)    ; Reset exception stuff
  486. X    movem.l    (sp)+,a3/a4/a5        ; and return the registers
  487. X    rts
  488. X
  489. X    ; This is the exception code.  No matter what machine we're on,
  490. X    ; we get an exception.  If the MMU's in place, we should get a
  491. X    ; privilige violation; if not, an F-Line emulation exception.
  492. X2$
  493. X    move.l    (sp)+,d0        ; Get Amiga supplied exception #
  494. X    cmpi    #11,d0            ; Is it an F-Line?
  495. X    beq    3$            ; If so, go to the fail routine
  496. X    move.l    #68851,d0        ; We have MMU
  497. X    addq.l    #4,2(sp)        ; Skip the MMU instruction
  498. X    rte
  499. X3$
  500. X    moveq.l    #0,d0            ; It dinna woik,
  501. X    addq.l    #4,2(sp)        ; Skip the MMU instruction
  502. X    rte
  503. X
  504. X;======================================================================
  505. X;
  506. X;    This function returns the MMU CRP register.  It assumes a 68020 
  507. X;    system with MMU, or a 68030 based system (eg, test for MMU before
  508. X;    you call this, or you wind up in The Guru Zone).  Note that the
  509. X;    CRP register is two longwords long.
  510. X;
  511. X;    void GetCRP(ULONG *)
  512. X;
  513. X;======================================================================
  514. X
  515. X_GetCRP:
  516. X    move.l    4(sp),a0        ; Pointer to the CRP storage area
  517. X    move.l    4,a6            ; Get ExecBase
  518. X    move.l    a5,-(sp)
  519. X    lea    2$,a5            ; Get the start of the supervisor code
  520. X    CALLSYS    Supervisor
  521. X    move.l    (sp)+,a5
  522. X    rts
  523. X2$
  524. X    dc.w    $f010            ; PMOVE CRP,(a0)
  525. X    dc.w    $4e00
  526. X    rte
  527. X
  528. X;======================================================================
  529. X;
  530. X;    This function returns the MMU TC register.  It assumes a 68020 
  531. X;    system with MMU, or a 68030 based system (eg, test for MMU before
  532. X;    you call this, or you wind up in The Guru Zone).  
  533. X;
  534. X;    ULONG GetTC()
  535. X;
  536. X;======================================================================
  537. X
  538. X_GetTC:
  539. X    move.l    4,a6            ; Get ExecBase
  540. X    move.l    a5,-(sp)
  541. X    subq.l    #4,sp            ; Make a place to dump TC
  542. X    move.l    sp,a0
  543. X    lea    2$,a5            ; Get the start of the supervisor code
  544. X    CALLSYS    Supervisor
  545. X    move.l    (sp),d0            ; Here's the result
  546. X    addq.l    #4,sp
  547. X    move.l    (sp)+,a5
  548. X    rts
  549. X2$
  550. X    dc.w    $f010            ; PMOVE TC,(a0)
  551. X    dc.w    $4200
  552. X    rte
  553. X
  554. X    end
  555. X
  556. SHAR_EOF
  557. echo "extracting makefile"
  558. sed 's/^X//' << \SHAR_EOF > makefile
  559. X######################################################################
  560. X#
  561. X# Makefile for CacheCard V1.0
  562. X#
  563. X######################################################################
  564. X
  565. X.a.o:
  566. X    as -o $@ $*.a
  567. X
  568. XCFLAGS    = +x5
  569. XLFLAGS    = -lm -lc
  570. X
  571. XCOBJS    = cachecard.o
  572. XOBJS    = 030stuff.o $(COBJS)
  573. X
  574. XCacheCard:    $(OBJS) cachecard.o
  575. X        ln $(OBJS) -o CacheCard $(LFLAGS)
  576. X
  577. X$(COBJS):    cachecard.h
  578. X
  579. SHAR_EOF
  580. echo "extracting CacheCard.uu"
  581. sed 's/^X//' << \SHAR_EOF > CacheCard.uu
  582. X
  583. Xbegin 644 CacheCard
  584. XM```#\P`````````#``````````(```B\````S`````$```/I```(O$[Z%D@L.
  585. XM>``$2.<`'")\`````$ZN_MHF0"AK`#(G?````%(`,G#_68_P%T(`#$```&<4R
  586. XM#$#__V<.""X``@$I9P8@/``!";Y8CR=,`#),WS@`3G4@'PQ```MG#"`\``$,6
  587. XM\UBO``).<W``6*\``DYS(&\`!"QX``0O#4OZ``I.KO_B*E].=?`03@!.<RQX9
  588. XM``0O#5F/($]+^@`.3J[_XB`76(\J7TYU\!!"`$YS3E7__D)M__X@;0`(2A!G6
  589. XM/"!M``Q*$&<T(&T`"%*M``@0$$B`P'P`WR!M``Q2K0`,$A!(@<)\`-^P068(T
  590. XM.WP``?_^8`1";?_^9P)@O"!M``A*$&82(&T`#$H09@I*;?_^9P1P`6`"<`!.$
  591. XM74YU3E7_\$*M__!.NO]J"```'V8&<`!.74YU2&W_]$ZZ_SI83RMM__C_\$*MO
  592. XM__P@+?_\Y8`@;?_P(C`(`,*\`````V8N("W__.6`(&W_\"(P"`#"O/____QGT
  593. XM&"`M__SE@"!M__`B`"`P&`#`O/____Q@I%*M__P,K0``$`#__&6N<`!@DDY5:
  594. XM__A"K?_\2'C__TAX__]"ITZZ(3)/[P`,*T#__&8.2'H`K$ZZ!9I83TY=3G5(W
  595. XM>@"X3KH%C%A/(&W__'``$"@`$3\`(&W__#\H`!1(>@#*3KH%;E!/(&W__"\HZ
  596. XM`"0@;?_\+R@`($AZ`,!.N@543^\`#"!M__P@*``@<A'BJ"M`__@@+?_XY8`@X
  597. XM;(+B(F@`"`@Q``8(`V<,2'H`GTZZ!2)83V`*2'H`G4ZZ!1983TAX__](>/__E
  598. XM+RW__$ZZ((I/[P`,*T#__&8`_W!@`/]>3F\@06UI9V$@1&5V:6-E<R!P<F5S$
  599. XM96YT"@!$159)0T4@("`@("`@("`@("`@041$4D534R`@("`@3$5.1U1(("`@I
  600. XM($-!0TA%"@`H)31X+"4T>"D@("`@("``)3AL>"`@("`E.&QX("`@(`!$25-!`
  601. XM0DQ%1`H`14Y!0DQ%1`H`3E7_YD*M__Q"IR\\@```04AZ`EY.N@1>3^\`#`QML
  602. XM``(`"&8@(&T`"B)H``0,$0`_9A)(>@)S3KH$/%A/0F=.NAT@5$].NOS:*T#_(
  603. XM_+"\``$,\V<>#*T``0F^__QG%$AZ`G=.N@006$\_/``*3KH<\E1/3KK]OBE`,
  604. XM@N)F%$AZ`H!.N@/R6$\_/``*3KH<U%1/(&R"X@R0````1F4@(&R"X@RH````A
  605. XM`0!"9Q)(>@*&3KH#Q%A/0F=.NARH5$](>``A2'H"MTZZ'N103RE`@`)F%$AZ`
  606. XM`KE.N@.>6$\_/``*3KH<@%1/#&T``0`(;P`!:DAM__!(>@*^(&T`"B\H``A.=
  607. XMN@,$3^\`#$AM_^Q(>@*J(&T`"B\H``Q.N@+L3^\`#$AZ`IH@;0`*+R@`!$ZZK
  608. XM_)I03TI`9P9";?_J8#)(>@*&(&T`"B\H``1.NOQ^4$]*0&<(.WP``?_J8!1()
  609. XM>@)O3KH#%EA//SP`"DZZ&_A43R\M_^PO+?_P0J=.NAZ"3^\`#"M`_^9F*"\M=
  610. XM_^PO+?_P2'H"4DZZ`N)/[P`,+RR``DZZ';Y83S\\``I.NANX5$\@;?_F("@`F
  611. XM('(1XJ@K0/_X(&W_YB`H`"1R$>*HL+P````!8PX@;?_F("@`)'(1XJA@`G`!6
  612. XM*T#_]"`M__13K?_T2H!G9B!L@N(@+?_XL*@`.F18("W_^.6`(&R"XB)H``@BW
  613. XM,0@`PKP````#9SQ*;?_J9QP@+?_X4JW_^.6`(&R"XB)H``C3P`BI``8``V`:H
  614. XM("W_^%*M__CE@"!L@N(B:``(T\`(Z0`&``-@CDZZ_%PO+(`"3KH<_%A/0F=.7
  615. XMNAKX5$].74YUFS,S;4-A8VAE0V%R9"!6)3$N,F8@0V]P>7)I9VAT(#$Y.#D@?
  616. XM8GD@1&%V92!(87EN:66;,&T*`%5S86=E.B!#86-H94-A<F0@6T5.04),17Q$Z
  617. XM25-!0DQ%(&UA;G5F(R!P<F]D(UT*`$5R<F]R.B!3>7-T96T@9&]E<R!N;W0@N
  618. XM8V]N=&%I;B!A;B!-354*`$5R<F]R.B!3971#4%4@1D%35%)/32!O<B!+24-+K
  619. XM4D]-(&UU<W0@8F4@:6YS=&%L;&5D"@!%<G)O<CH@5F5R<VEO;B!O9B!3971#V
  620. XM4%4@:7,@:6YC;VUP871I8FQE+"!U<V4@;F5W97(@0V%C:&5#87)D('!R;V=R*
  621. XM86T*`&5X<&%N<VEO;BYL:6)R87)Y`$5R<F]R.B!#86XG="!F:6YD(")E>'!A2
  622. XM;G-I;VXN;&EB<F%R>2(*`"5L>``E;'@`1$E304),10!%3D%"3$4`17)R;W(ZG
  623. XM($EL;&5G86P@;W!T:6]N"@!%<G)O<CH@1&5V:6-E("@E;'@L)6QX*2!.;W0@Q
  624. XM1F]U;F0*``!.50``*6T`"(+20BR"UDAM`!`O+0`,2'H`#DZZ!(Q/[P`,3EU.Y
  625. XM=4Y5``!*;0`(9B0@;(+22A!G%"!L@M)2K(+2$!!(@,!\`/].74YU&7P``8+6'
  626. XM8!A*+(+69A)3K(+2(&R"TA`02(#`?`#_8-QP_V#83E4``$AM``PO+0`(2'H45
  627. XM*DZZ`)A/[P`,3EU.=4Y5``!(YP@@)&T`#@QM``0`$F8((&T`""@08!Q*;0`,D
  628. XM;PP@;0`(<``P$"@`8`H@;0`(,!!(P"@`0FT`$DIM``QL$$1M``Q*A&P(1(0[9
  629. XM?``!`!(R+0`,2,$@!$ZZ$UI![(`&4XH4L```,BT`#$C!(`1.NA-0*`!FVDIM2
  630. XM`!)G!E.*%+P`+2`*3-\$$$Y=3G5.5?\B2.<(,"1M``@F;0`,0FW_^BMM`!#_B
  631. XM_"!+4HL0$$B`.`!G``-@N'P`)68``SY"+?\P.WP``?_X.WP`(/_V.WPG$/_TH
  632. XM($M2BQ`02(`X`+!\`"UF#D)M__@@2U*+$!!(@#@`N'P`,&80.WP`,/_V($M2V
  633. XMBQ`02(`X`+A\`"IF&"!M__Q4K?_\.U#_\B!+4HL0$$B`.`!@,D)M__)@'#`MZ
  634. XM__+!_``*T$20?``P.T#_\B!+4HL0$$B`.``P!%)`0>R`C@@P``(``&;4N'P`%
  635. XM+F9:($M2BQ`02(`X`+!\`"IF&"!M__Q4K?_\.U#_]"!+4HL0$$B`.`!@,D)M5
  636. XM__1@'#`M__3!_``*T$20?``P.T#_]"!+4HL0$$B`.``P!%)`0>R`C@@P``(`G
  637. XM`&;4.WP``O_PN'P`;&82($M2BQ`02(`X`#M\``3_\&`0N'P`:&8*($M2BQ`0P
  638. XM2(`X`#`$2,!@``#\.WP`"/_N8!8[?``*_^Y@#CM\`!#_[F`&.WS_]O_N/RW_T
  639. XM\$AM_S`_+?_N+RW__$ZZ_>(K0/_J,"W_\$C`T:W__$_O``Q@``#,(&W__%BM/
  640. XM__PB4"M)_^H@"4H99OR3P%.).TG_\&```+@P!)!\`&4_``QM)Q#_]&8$<`9@Y
  641. XM!#`M__0_`$AM_R(@;?_\4*W__$*G+Q!.N@C$0>W_(BM(_^H@"$H89OR1P%.(H
  642. XM.TC_\#M\`,C_]$_O`!!@9B!M__Q4K?_\.!!![?\O*TC_ZA"$8$3_J/\(_UC_X
  643. XM6/]8_[+_LO^R_[+_LO^R_[+^\/^R_[+_LO\X_[+^^/^R_[+_`)"\````8["\A
  644. XM````%F2ZXX`P.P#"3OL``$'M_S"1[?_J.TC_\#`M__"P;?_T;P8[;?_T__!*H
  645. XM;?_X9V@@;?_J#!``+6<*(&W_Z@P0`"MF+@QM`##_]F8F4VW_\B!M_^I2K?_JM
  646. XM$!!(@#\`3I*P?/__5$]F"G#_3-\,$$Y=3G5@%C\M__9.DK!\__]43V8$</]@E
  647. XMY%)M__HP+?_R4VW_\K!M__!NW$)M_^Y@("!M_^I2K?_J$!!(@#\`3I*P?/__<
  648. XM5$]F!'#_8+!2;?_N(&W_ZDH09PHP+?_NL&W_]&W.,"W_[M%M__I*;?_X9BA@K
  649. XM&#\\`"!.DK!\__]43V8&</]@`/]X4FW_^C`M__)3;?_RL&W_\&[:8!8_!$Z2V
  650. XML'S__U1/9@9P_V``_U)2;?_Z8`#\EC`M__I@`/]"3E7_<DCG#S`D;0`,)FT`L
  651. XM$'H`*6T`"(+:($I2BA`02(`X`&<``UBX?``E9@`#&$(M__M"+?_Z0BW_^3E\S
  652. XM`'^"V`P2`"IF"%**&WP``?_[$!)(@%)`0>R`C@@P``(``&<T0FR"V!`22(`RM
  653. XM+(+8P_P`"M!!D'P`,#E`@MA2BA`22(!20$'L@(X(,``"``!FUAM\``'_^0P2F
  654. XM`&QF"!M\``'_^E**($I2BA`02(`^`$C`8``"*G@E8``"IAM\`/__^F`&&WP`X
  655. XM`?_Z>`Q\"F`6&WP``?_Z>`!\$&`*&WP``?_Z>`Y\"$ZZ`L9*0&8``I)(;?_\8
  656. XM/P8P!$C`0>R`+]"(+P`P!$C`0>R`&-"(+P!.N@.>2D!/[P`.9P`"9DHM__MF1
  657. XM,$HM__IL#"!+6(LB4#*M__Y@'$HM__IO#"!+6(LB4"*M__Q@"B!+6(LB4#*MN
  658. XM__Y216```?(;?``!__I.N@)02D!F``(<2&W_<DZZ`GQ*0%A/9@`"#$HM__MF(
  659. XM+DHM__IG%$AM_W).N@08($M8BR)0(H!83V`22&W_<DZZ!`0@2UB+(E`B@%A/=
  660. XM4D5@``&:0BW_^@P2`%YG!@P2`'YF"%**&WP``?_Z0>W_<BM(__1@"B!M__12;
  661. XMK?_T$(0@2E**$!!(@#@`L'P`76;F(&W_]$(08!P;?``!__H;?``@_W(;?``)6
  662. XM_W,;?``*_W1"+?]U3KH!GDI`9@`!:DHM__MF""!+6(LK4/_T0BW_^3`L@MA3V
  663. XM;(+82D!G;D)G(&R"VDZ0.`"P?/__5$]G7$HM__IG&#\$2&W_<DZZ"$Y*@%Q/'
  664. XM9P1P`6`"<`!@%C\$2&W_<DZZ"#9*@%Q/9@1P`6`"<`!G#C\\``$@;(+:3I!4`
  665. XM3V`82BW_^V8*(&W_]%*M__00A!M\``'_^6"&2BW_^6<``-9*+?_[9@Z^?`!C2
  666. XM9P8@;?_T0A!216```(1*+?_Y9@8Y?``!@MA"+?]R&WP``?_Z8`#_/)"\````]
  667. XM)6<`_="0O````!]G`/W44X!G`/Y@4X!G`/Y:D+P````)9P#]UI"\````"6<`Q
  668. XM_<!7@&<`_IA1@&>H4X!G`/VJ4X!G`/XV4X!G`/XP58!G`/V*7X!G`/VJ68!G8
  669. XM`/ZT6X!G`/V28#0P!%)`0>R`C@@P``0``&<(851*0&8B8!Q"9R!L@MI.D+!$I
  670. XM5$]G#C\\``$@;(+:3I!43V`$8`#\GDI%9B9"9R!L@MI.D+!\__]43V8*</],=
  671. XMWPSP3EU.=3\\``$@;(+:3I!43S`%8.A.50``0F<@;(+:3I!20$'L@(X(,``$&
  672. XM``!43V<"8.8_/``!(&R"VDZ0L'S__U1/9@9P_TY=3G5P`ϧ__$CG""!"I
  673. XM+?__0BW__4(M__XD;0`(8```B$)G(&R"VDZ0.``P!%)`0>R`C@@P``(``%1/(
  674. XM9EY*+?__9@ZX?``N9@@;?``!__]@2DHM__UF)+A\`&5G!KA\`$5F&+7M``AG(
  675. XM$D(M__X;?``!__\;?``!__U@)DHM__YF#+A\`"UG%+A\`"MG#C\\``$@;(+:H
  676. XM3I!43V`:&WP``?_^($I2BA"$,"R"V%-L@MA*0&8`_VY"$K7M``AF!'`!8`)P!
  677. XM`$S?!!!.74YU3E7_^DCG#"!*;(+8;@IP`$S?!#!.74YU0FW_^G``.@!(P"M`N
  678. XM__Q"9R!L@MI.D#@`L'P`+51/9@H[?``!__I216`6N'P`*V8$4D5@##\\``$@T
  679. XM;(+:3I!43V!P0F<@;(+:3I!43S@`/P`O+0`(3KH%B"1`2H!<3V8H#&T`$``0;
  680. XM9A)*K?_\9@RX?`!X9SRX?`!89S8_/``!(&R"VDZ05$]@,#(M`!!(P2`M__Q.7
  681. XMN@DJ*T#__"`*D*T`""!M``P2,```2(%(P=.M__Q21;IL@MAMBDIM__IG#B!MJ
  682. XM`!(@+?_\1(`@@&`((&T`$B"M__PP!6``_R!.5?_>+PHD;0`(*WP`````__`K4
  683. XM?*```$3_Z`P2`"!G!@P2``EF!%**8/`,$@`M9@I2BCM\``'_YF`,0FW_Y@P2!
  684. XM`"MF`E**0FW_WD)M_^(K;?_P__@0$DB`4D!![("."#```@``9SHB+?_H("W_=
  685. XM^$ZZ`\HK0/_X$A)(@9)\`#!(P2`!3KH#K"(`("W_^$ZZ`UPK0/_X2FW_XF<$M
  686. XM4VW_WF`6#!(`+F8.2FW_XF8..WP``?_B8`)@!%**8)H,$@!E9P8,$@!%9F)2!
  687. XMB@P2`"UF"E**.WP``?_D8`Q";?_D#!(`*V8"4HI";?_@8!H@2E**$!!(@#(M<
  688. XM_^##_``*T$&0?``P.T#_X!`22(!20$'L@(X(,``"``!FU$IM_^1G!$1M_^`P_
  689. XM+?_@T6W_WDIM_]YL(#`M_]Y2;?_>2D!G$B(M_^@@+?_X3KH"XBM`__A@XF`DN
  690. XM2FW_WF\>,"W_WE-M_]Y*0&<2(BW_Z"`M__A.N@+0*T#_^&#B2FW_YF<,("W_.
  691. XM^$ZZ`H`K0/_X("W_^"1?3EU.=4Y5__A(YP@P)&T`$$'L@$8F2#`M`!120#M`:
  692. XM__A";?_^(BT`"$ZZ`E1L%"`M``A.N@)`*T``""!*4HH0O``M(BT`"$ZZ`C9OO
  693. XM0B(K``0@+0`(3KH"%&P4(A,@+0`(3KH"3BM```A3;?_^8-XB$R`M``A.N@'T=
  694. XM;10B$R`M``A.N@(:*T``"%)M__Y@X`QM``(`%F8>.VT`%/_X#&W__/_^;0HP^
  695. XM+?_^L&T`%&\$0FT`%F`0#&T``0`69@@P+?_^T6W_^$IM__AM0@QM`!#_^&\$@
  696. XM<!!@!#`M__A20$C`Y8`B,P@`("T`"$ZZ`78K0``((A-.N@%V;10K:P`$``A2$
  697. XM;?_^2FT`%F<$4FW_^$IM`!9G3DIM__YL/"!*4HH0O``P($I2BA"\`"XP+?_^2
  698. XM1$`X`%-$2FW_^&X$."T`%#`$4T1*0&<*($I2BA"\`#!@[D)M__I@"C`M__Y2`
  699. XM0#M`__I@!CM\``'_^DIM__AO:G@`N'P`$&P\("T`"$ZZ`0X[0/_\,"W__-!\\
  700. XM`#`@2E**$(`R+?_\2,$@`4ZZ`0XB`"`M``A.N@#P(A-.N@$(*T``"&`(($I2M
  701. XMBA"\`#!3;?_X9QA*;?_Z9PY3;?_Z9@@@2E**$+P`+E)$8)A*;0`69GH@2E**)
  702. XM$+P`94IM__YL#D1M__X@2E**$+P`+6`(($I2BA"\`"L,;0!D__YM)#`M__Y(^
  703. XMP('\`&30?``P($I2BA"`,"W__DC`@?P`9$A`.T#__C`M__Y(P('\``K0?``P;
  704. XM($I2BA"`,"W__DC`@?P`"DA`T'P`,"!*4HH0@$(23-\,$$Y=3G4O//___[Y.6
  705. XM^@!2+SS____63OH`2"\\____Q$[Z`#XO//___]!.^@`T+SS____B3OH`*B\\G
  706. XM____N$[Z`"`O//___ZQ.^@`6+SS____<3OH`#"\\____LD[Z``)*K(+F9C)()
  707. XMY\#`0J=(>@!"3KH`GE!/*4""YF88+SP````02'H`/$ZZ`'(O`$ZZ`'1.N@`^,
  708. XM3-\#`R\((&\`!"].``0L;(+F3K:(`$S?00!.=6UA=&AF9G`N;&EB<F%R>0!NN
  709. XM;R!M871H(&QI8G)A<GD*3E4``$AX``1(>@`<3KH`'"\`3KH`'C\\``%.N@I(L
  710. XM3^\`#DY=3G5>0PH`+&R"ZD[N_\1,[P`.``0L;(+J3N[_T"QL@NXB;P`$("\`P
  711. XM"$[N_=@@;P`$,"\`"!(89PJR`&;X(`A3@$YU<`!.=6%P0^R"TD7L@M*UR68.Z
  712. XM,CP`%VL(=``BPE')__PI3X+R+'@`!"E.@NY(YX"`""X`!`$I9Q!+^@`(3J[_R
  713. XMXF`&0J?S7TYS0_H`($ZN_F@I0(+J9@PN/``#@`=.KO^48`1.N@`:4$].=61O(
  714. XM<RYL:6)R87)Y`$GY``!__DYU3E4``"\*2'D``0``,"R"R,'\``8O`$ZZ"W0I^
  715. XM0(+V4$]F%$*G2'D``0``3KH+.%!/+FR"\DYU(&R"]D)H``0@;(+V,7P``0`0K
  716. XM(&R"]C%\``$`"B!L@O(@+(+RD*@`!%"`*4""^B!L@OH@O$U!3EA"ITZZ"R@D-
  717. XM0$JJ`*Q83V<N+RT`#"\M``@O"DZZ`*XY?``!@OX@;(+V`&B````$(&R"]@!HI
  718. XM@```"D_O``Q@0DAJ`%Q.N@LV2&H`7$ZZ"P0I0(,`(&R#`$JH`"103V<0(&R#H
  719. XM`")H`"0O$4ZZ"CI83R\L@P`O"DZZ`HPI;(,`@P103TZZ"CH@;(+V((!.NOY,.
  720. XM(&R"]B%```9G%DAX`^U(>@`J3KH*-B!L@O8A0``,4$\O+(,$/RR#"$ZZZOI"B
  721. XM9TZZ"%103R1?3EU.=2H`3E4``$CG##`D;0`0(&T`"$JH`*QG&"!M``@@*`"LO
  722. XMY8`H`"!$("@`$.6`)D!@!"9L@LH0$TB`2,#0K0`,5(`Y0(,*0J<P+(,*2,`OU
  723. XM`$ZZ"@8I0(,,4$]F"$S?##!.74YU$!-(@#H`/P4@2U*(+P@O+(,,3KH!?C`%]
  724. XM2,`@0-'L@PQ#^@%$$-EF_#\M``XO"B\L@PQ.N@$Z(&R##$(P4``Y?``!@P@PO
  725. XM!4C`T*R##"9`4HLD2T_O`!00$TB`.@"P?``@9QBZ?``)9Q*Z?``,9PRZ?``-\
  726. XM9P:Z?``*9@12BV#8#!,`(&UZ#!,`(F8N4HL@2U*+$!!(@#H`9QX@2E**$(6Z(
  727. XM?``B9A`,$P`B9@12BV`&0BK__V`"8-9@."!+4HL0$$B`.@!G)KI\`"!G(+I\F
  728. XM``EG&KI\``QG%+I\``UG#KI\``IG""!*4HH0A6#.($I2BD(02D5F`E.+4FR#E
  729. XM"&``_UI"$D*G,"R#"%)`2,#E@"\`3KH(Y"E`@P103V8(0FR#"&``_MAZ`"9L_
  730. XM@PQ@)#`%2,#E@"!L@P0ABP@`($L@"$H89OR1P%.(,`A20$C`U\!21;IL@PAM=
  731. XMUC`%2,#E@"!L@P1"L`@`8`#^E"``,#Q__V`$,"\`#"!O``1*&&;\4T@B;P`(;
  732. XM4T`0V5?(__QG`D(0("\`!$YU3.\#```$(`@R+P`,8`(0V5?)__QG!E)!8`)"(
  733. XM&%')__Q.=4CG<``T`<3`)@%(0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.=4Y5K
  734. XM``!(YPXP)&T`"$*G2'H`CDZZ^]@I0(,04$]F"$S?#'!.74YU(&T`#")H`"0ON
  735. XM*0`$3KH(:B@`6$]G4DAZ`&T@1"\H`#9.N@@\)D!*@%!/9S1(>`/M+PM.N@=\Z
  736. XM+`!03V<D(`;E@"H`($4E:``(`*0E1@"<2'@#[4AZ`#A.N@=8)4``H%!/+P1.F
  737. XMN@@(6$\O+(,03KH'>$*L@Q!83V"`:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$CGK
  738. XM2`!"A$J`:@1$@%)$2H%J!D2!"D0``6$^2D1G`D2`3-\`$DJ`3G5(YT@`0H1*:
  739. XM@&H$1(!21$J!:@)$@6$:(`%@V"\!81(@`2(?2H!.=2\!808B'TJ`3G5(YS``N
  740. XM2$%*068@2$$V`30`0D!(0(##(@!(0#("@L,P`4)!2$%,WP`,3G5(028!(@!")
  741. XM04A!2$!"0'0/T(#3@;:!8@22@U)`4<K_\DS?``Q.=4Y5``!(;($F/RT`"$ZZ_
  742. XM``A<3TY=3G5.50``+P0X+0`(+RT`"C\$3KH`,+A\``I<3V8D(&T`"A`H``Q(;
  743. XM@`@```=G%#\\__\O+0`*3KH`]%Q/*!].74YU8/A.50``+PHD;0`*(%*QZ@`$E
  744. XM91@P+0`(P'P`_S\`+PI.N@#(7$\D7TY=3G4@4E*2$"T`"1"`2(#`?`#_8.A.&
  745. XM50``+PI![($0)$@@2M7\````%B\(81!83T'L@LBUR&7J)%].74YU3E4``$CG>
  746. XM""`D;0`(>``@"F8*</],WP003EU.=4HJ``QG4`@J``(`#&<,/SS__R\*85(XV
  747. XM`%Q/$"H`#4B`/P!.N@3RB$`(*@`!``Q43V<*+RH`"$ZZ`BY83P@J``4`#&<2.
  748. XM+RH`$DZZ`L`O*@`23KH"%%!/0I)"J@`$0JH`"$(J``PP!&"03E7__DCG""`D,
  749. XM;0`(0?K_1BE(@Q0(*@`$``QG"G#_3-\$$$Y=3G4(*@`"``QG,"!2D>H`"#@(8
  750. XM/P0O*@`($"H`#4B`/P!.N@*`L$103V<0".H`!``,0I)"J@`$</]@P`QM__\`2
  751. XM#&80"*H``@`,0I)"J@`$<`!@J$JJ``AF""\*3KH`FEA/#&H``0`09BH;;0`-6
  752. XM__\_/``!2&W__Q`J``U(@#\`3KH"(K!\``%03V:@,"T`#&``_VHDJ@`(,"H`;
  753. XM$$C`T*H`""5```0(Z@`"``P@4E*2$"T`#1"`2(#`?`#_8`#_/DY5```O"D'L<
  754. XM@1`D2$HJ``QG&-7\````%D'L@LBUR&4(<``D7TY=3G5@XD*20JH`!$*J``@@_
  755. XM"F#J3E7__"\*)&T`"#\\!`!.N@#`*T#__%1/9A@U?``!`!`@2M'\````#B5(&
  756. XM``@D7TY=3G4U?`0``!`(Z@`!``PE;?_\``@0*@`-2(`_`$ZZ`.)*0%1/9P8`D
  757. XM*@"```Q@SDY5``!(YP`P)&R"WF`4)E(@*@`$4(`O`"\*3KH$#E!/)$L@"F;HH
  758. XM0JR"WDS?#`!.74YU3E4``"\*0?K_QBE(@QA"IR`M``A0@"\`3KH#O"1`2H!0=
  759. XM3V8(<``D7TY=3G4DK(+>)6T`"``$*4J"WB`*4(!@YDY5``!P`#`M``@O`&&RY
  760. XM6$].74YU3E4``$CG`#"7RR1L@MY@#B!M``A1B+'*9Q(F2B12(`IF[G#_3-\,#
  761. XM`$Y=3G4@"V<$)I)@!"E2@MX@*@`$4(`O`"\*3KH#8'``4$]@V$Y5```O"C`ML
  762. XM``C!_``&)$#5[(+V2FT`"&T.,"T`"+!L@LAL!$J29@XY?``"@QQP_R1?3EU.N
  763. XM=3`M``C!_``&(&R"]B\P"`!.N@*<2H!83V<$<`%@`G``8-A.50``+RT`"$ZZ4
  764. XM`F9*@%A/9@Y.N@)P.4"#''#_3EU.=7``8/A.50``2.<,(#@M``A.N@!P,`3!<
  765. XM_``&)$#5[(+V2D1M"KAL@LAL!$J29A`Y?``"@QQP_TS?!#!.74YU,"H`!,!\`
  766. XM``-F"CE\``6#''#_8.1P`#`M``XO`"\M``HO$DZZ]AXJ`+"\_____T_O``QF.
  767. XM#$ZZ`?`Y0(,<</]@N"`%8+1.5?_\2'@0`$*G3KH"?BM`__P(```,4$]G$DIL$
  768. XM@OYF""`M__Q.74YU3KKUHG``8/1.50``2JR#%&<&(&R#%$Z0/RT`"$ZZ``A4]
  769. XM3TY=3G5.5?_\+P0P+0`(2,`K0/_\2JR"]F<H>`!@"C\$3KH`_E1/4D2X;(+(P
  770. XM;?`P+(+(P?P`!B\`+RR"]DZZ`=903TJL@QAG!B!L@QA.D$JL@LYG"B\L@LY.Y
  771. XMN@%@6$]*K(,>9P@@;(,>(*R#(DJL@R9G"B\L@R9.N@%N6$]*K(+F9PHO+(+FJ
  772. XM3KH!7EA/2JR#*F<*+RR#*DZZ`4Y83TJL@RYG"B\L@RY.N@$^6$\L>``$""X`8
  773. XM!`$I9Q0O#4OZ``I.KO_B*E]@!D*G\U].<TJL@P!F,$JL@PQG*#`L@PI(P"\`_
  774. XM+RR##$ZZ`2XP+(,(4D!(P.6`+P`O+(,$3KH!&D_O`!!@#DZZ`0@O+(,`3KH!O
  775. XM*%A/("W__"YL@O).=2@?3EU.=4Y5``!(YPX@."T`"#`$P?P`!B1`U>R"]DI$L
  776. XM;0JX;(+(;`1*DF80.7P``H,<</],WP1P3EU.=0@J``<`!&8(+Q).N@`*6$]"@
  777. XMDG``8.(B+P`$+&R"ZD[N_]PB+P`$+&R"ZD[N_X(B+P`$+&R"ZD[N_[@L;(+J:
  778. XM3N[_RBQL@NI.[O]\(B\`!"QL@NI.[O\H3.\`!@`$+&R"ZD[N_^).^@`"(B\`]
  779. XM!"QL@NI.[O^F2.<!!$SO((``#"QL@NY.KO^43-\@@$YU3OH``B)O``0L;(+N0
  780. XM3N[^8DSO``,`!"QL@NY.[O\Z(F\`!"QL@NY.[O[:+&R"[D[N_WPB;P`$("\`O
  781. XM""QL@NY.[O\N(&\`!"QL@NY.[OZ,3OKSD")O``0L;(+N3N[^ADSO``,`!"QL<
  782. XM@NY.[O[.(&\`!"QL@NY.[OZ`3.\#```$+&R#$$[N_Z`@;P`$+&R#$$[N_Z8@4
  783. XM;P`$+&R#$$[N_[(@;P`$3.\``P`(+&R``D[N_[@```/L`````0`````````>_
  784. XM`````0````$``!:^`````````_(```/J````M``````P,3(S-#4V-S@Y86)C?
  785. XM9&5F``!!0D-$149A8F-D968Y.#<V-30S,C$P``H+#`T.#PH+#`T.#PD(!P8%?
  786. XM!`,"`0``H```1(```$&```!`S,S-/*/7"CF#$FXVT;<6,J?%JR^&-[PLUK^3I
  787. XM**O,=B6)<%XBV^;]'J_K_AN,O,L8X2X2%+0DVQ&0'7P.`"`@("`@("`@(#`P=
  788. XM,#`P("`@("`@("`@("`@("`@("`@D$!`0$!`0$!`0$!`0$!`0`P,#`P,#`P,`
  789. XM#`Q`0$!`0$!`"0D)"0D)`0$!`0$!`0$!`0$!`0$!`0$!`0%`0$!`0$`*"@H**
  790. XM"@H"`@("`@("`@("`@("`@("`@("`D!`0$`@``````````````````$`````=
  791. XM`0`````````````````````!`0````$``````````````````````0(````!(
  792. XM`````````````````````````````````````````````````````````````
  793. XM`````````````````````````````````````````````````````````````
  794. XM`````````````````````````````````````````````````````````````
  795. XM`````````````````````````````````````````````````````````````
  796. XM`````````````````````````````````````````````````````````````
  797. XM`````````````````````````````````````````````````````````````
  798. XM`````````````````````````````````````````````````````````````
  799. XM`````````````````````````````````````````````````````````````
  800. XL`````````````````````````!0``````````````_(```/K`````0```_(`M
  801. X``
  802. Xend
  803. Xsize 9764
  804. SHAR_EOF
  805. echo "End of archive 1 (of 1)"
  806. # if you want to concatenate archives, remove anything after this line
  807. exit
  808.